﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SGT_DAL._STG_DALTableAdapters;
using SGT_DAL;

namespace SGT_ON
{
    /// <summary>
    /// Clase utilizada para la presentación y propiedades derivadas.
    /// </summary>
    public partial class StockLineaDeRemito
    {
        public string StockProductoNombre
        {
            get
            {
                if (MovimientoAsociado == null)
                    return "";

                return MovimientoAsociado.Producto.Nombre;
            }
        }
    }
    /// <summary>
    /// Clase base con la lógica de negocio
    /// </summary>
    [System.ComponentModel.DataObject]
    public partial class StockLineaDeRemito
    {
        #region Atributos
        protected int _id;
        protected int _IdRemito;
        protected int _IdMovimientoStock;
        protected int _Cantidad;

        //Objetos asociados
        protected StockMovimientoStock _MovimientoAsociado;
        #endregion

        #region Propiedades
        public int ID
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }
        public int IdRemito
        {
            get
            {
                return _IdRemito;
            }
            set
            {
                _IdRemito = value;
            }
        }
        public int IdMovimientoStock
        {
            get
            {
                return _IdMovimientoStock;
            }
            set
            {
                _IdMovimientoStock = value;

                // si el id es distinto al del objeto que tengo cargado, lo borro
                if ((_MovimientoAsociado != null)
                    && (_MovimientoAsociado.ID != _IdMovimientoStock))
                    _MovimientoAsociado = null;
            }
        }
        public int Cantidad
        {
            get
            {
                return _Cantidad;
            }
            set
            {
                _Cantidad = value;
            }
        }
        
        //Objetos asociados
        public StockMovimientoStock MovimientoAsociado
        {
            get
            {
                //si lo tengo cargado, lo devuelvo
                if (_MovimientoAsociado != null)
                    return _MovimientoAsociado;

                if (IdMovimientoStock <= 0)
                    return null;

                return StockMovimientoStock.CrearStockMovimientoStock(IdMovimientoStock);
            }
            set
            {
                _MovimientoAsociado = value;
                IdMovimientoStock = _MovimientoAsociado.ID;
            }
        }

        //Propiedades derivadas
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private static StockLineaDeRemitoTableAdapter _StockLineaDeRemitoAD;
        protected static StockLineaDeRemitoTableAdapter Adaptador
        {
            get
            {
                if (_StockLineaDeRemitoAD == null)
                    _StockLineaDeRemitoAD = new StockLineaDeRemitoTableAdapter();

                return _StockLineaDeRemitoAD;
            }
        }
        protected static StockLineaDeRemito ObtenerPorID(int pID)
        {
            _STG_DAL.StockLineaDeRemitoDataTable _dt;

            _dt = Adaptador.ObtenerPorId(pID);

            // si tiene algo,
            if (_dt.Rows.Count > 0)
                return AsignarRowAObjeto((_STG_DAL.StockLineaDeRemitoRow)_dt.Rows[0]);

            return null;
        }
        protected static StockLineaDeRemito AsignarRowAObjeto(_STG_DAL.StockLineaDeRemitoRow pRow)
        {
            StockLineaDeRemito _StockLineaDeRemito = new StockLineaDeRemito();
            if (pRow != null)
            {
                _StockLineaDeRemito = new StockLineaDeRemito();
                _StockLineaDeRemito.ID = pRow.ID;
                _StockLineaDeRemito.IdRemito = pRow.IdRemito;
                _StockLineaDeRemito.IdMovimientoStock = pRow.IdMovimientoStock;
                _StockLineaDeRemito.Cantidad = pRow.Cantidad;
            }
            return _StockLineaDeRemito;
        }
        protected StockLineaDeRemito Insertar(int pIdRemito,int pIdMovimientoStock,int pCantidad)
        {
            ID = int.Parse(Adaptador.Insertar(pIdRemito, pIdMovimientoStock, pCantidad).ToString());
            return this;
        }
        protected bool Actualizar(int pIdRemito, int pIdMovimientoStock, int pCantidad, int pId)
        {
            if (0 < Adaptador.Actualizar(pIdRemito, pIdMovimientoStock, pCantidad, pId))
                return true;
            else
                return false;
        }
        //public void Eliminar()
        //{
        //    StockLineaDeRemito _StockLineaDeRemito = StockLineaDeRemito.ObtenerPorID(this.ID);
        //    _StockLineaDeRemito.EstaActivo = false;
        //    _StockLineaDeRemito.Actualizar();
        //}
        protected static StockLineaDeRemitoColeccion AsignarStockLineaDeRemitoTableAdapterAStockLineaDeRemitoColeccion(_STG_DAL.StockLineaDeRemitoDataTable pDataTable)
        {
            StockLineaDeRemitoColeccion _StockLineaDeRemitoes = new StockLineaDeRemitoColeccion();
            StockLineaDeRemito _StockLineaDeRemito;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (_STG_DAL.StockLineaDeRemitoRow _row in pDataTable.Rows)
                {
                    _StockLineaDeRemito = AsignarRowAObjeto(_row);
                    if (_StockLineaDeRemito != null)
                        _StockLineaDeRemitoes.Add(_StockLineaDeRemito);
                }
            }
            return _StockLineaDeRemitoes;
        }
        public static StockLineaDeRemitoColeccion ObtenerLineasDeRemito(int pIdRemito)
        {
            return AsignarStockLineaDeRemitoTableAdapterAStockLineaDeRemitoColeccion(Adaptador.ObtenerLineasDeRemito(pIdRemito));
        }
        /// <summary>
        /// Devuelve lo mismo que se le envia, se utiliza en la carga de nuevas lineas de remito sin que se tenga que usar la base de datos.
        /// </summary>
        /// <param name="pLineasADevolver"></param>
        /// <returns></returns>
        public static StockLineaDeRemitoColeccion ObtenerLineasDeRemitoSinBusqueda(StockLineaDeRemitoColeccion pLineasADevolver)
        {
            return pLineasADevolver;
        }
        
        #endregion

        #region Métodos
        public StockLineaDeRemito()
        {
            AsignarValoresIniciales();
        }

        public void AsignarValoresIniciales()
        {
            _id = -1;
            IdRemito = -1;
            IdMovimientoStock = -1;
            Cantidad = -1;
        }

        public static StockLineaDeRemito CrearStockLineaDeRemito()
        {
            StockLineaDeRemito _StockLineaDeRemito = new StockLineaDeRemito();
            return _StockLineaDeRemito;
        }
        public static StockLineaDeRemito CrearStockLineaDeRemito(int pID)
        {
            StockLineaDeRemito _StockLineaDeRemito = ObtenerPorID(pID);
            return _StockLineaDeRemito;
        }
        public void Actualizar()
        {
            Actualizar(IdRemito, IdMovimientoStock, Cantidad, ID);
        }
        public StockLineaDeRemito Insertar()
        {
            return Insertar(IdRemito, IdMovimientoStock, Cantidad);
        }
        #endregion

        #region Metodos para datasource

        public void Actualizar(StockLineaDeRemito pStockLineaDeRemito)
        {
            if (pStockLineaDeRemito != null)
                pStockLineaDeRemito.Actualizar();
        }
        public StockLineaDeRemito Insertar(StockLineaDeRemito pStockLineaDeRemito)
        {
            if (pStockLineaDeRemito != null)
                return pStockLineaDeRemito.Insertar();
            return null;
        }
        //public void Eliminar(StockLineaDeRemito pStockLineaDeRemito)
        //{
        //    pStockLineaDeRemito.Eliminar();
        //}
        #endregion
    }
    [System.ComponentModel.DataObject]
    public class StockLineaDeRemitoColeccion : System.Collections.CollectionBase
    {
        public void Add(StockLineaDeRemito pStockLineaDeRemito)
        {
            this.List.Add(pStockLineaDeRemito);
        }
        public void AddUnico(StockLineaDeRemito pStockLineaDeRemito)
        {
            foreach (StockLineaDeRemito _StockLineaDeRemito in this)
                if (pStockLineaDeRemito.ID == _StockLineaDeRemito.ID)
                    return;
            this.List.Add(pStockLineaDeRemito);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public void Remove(StockLineaDeRemito pStockLineaDeRemito)
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].ID == pStockLineaDeRemito.ID)
                {
                    Remove(i);
                    return;
                }

            }
        }
        public StockLineaDeRemito this[int index]
        {
            get { return ((StockLineaDeRemito)(this.List[index])); }
            set { this.List[index] = value; }
        }
        public void ActualizarStockLineaDeRemitoes(StockLineaDeRemitoColeccion pStockLineaDeRemitoes)
        {
            foreach (StockLineaDeRemito _StockLineaDeRemito in pStockLineaDeRemitoes)
            {
                _StockLineaDeRemito.Actualizar();
            }
        }
        public void ActualizarStockLineaDeRemito(StockLineaDeRemito pStockLineaDeRemito)
        {
            pStockLineaDeRemito.Actualizar();
        }

        #region Metodos de colección

        #endregion
        #region Para datasource
        public void Insertar(StockLineaDeRemito pStockLineaDeRemito)
        {
            pStockLineaDeRemito.Insertar(pStockLineaDeRemito);
        }
        #endregion
    }
}



